package com.itheima.springbootwebbtalis.service.Impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.springbootwebbtalis.commons.PassWordNot;
import com.itheima.springbootwebbtalis.commons.UserNameNot;
import com.itheima.springbootwebbtalis.mapper.EmpExprMapper;
import com.itheima.springbootwebbtalis.mapper.EmpMapper;
import com.itheima.springbootwebbtalis.pojo.*;
import com.itheima.springbootwebbtalis.service.EmpLogService;
import com.itheima.springbootwebbtalis.service.EmpService;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;
    @Autowired
    private EmpLogService empLogService;
    @Override
    public PageResult page(EmpQueryParam param) {
        // 1.使用分页插件实现分页查询
        // 1.1 启动/设置 分页插件
        PageHelper.startPage(param.getPage(),param.getPageSize());
        // 1.2 调用被分页插件增强的持久层方法
        Page<Emp> page=empMapper.selectByPage(param);
        // 1.3 从分页插件增强方法的返回结果中，获取数据数据分装到pageResult返回
        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());
        return pageResult;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void add(Emp emp) {
        try {
            // 1. 添加员工信息
            // 1.完成基本数据的添加
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.add2(emp);

            // 2.如果有员工经历的
            List<EmpExpr> exprList = emp.getExprList();
            if(exprList != null && exprList.size()>0){
                // 2.1 遍历集合，设置当前员工经历所属的员工信息
                exprList.stream().forEach(ex->ex.setEmpId(emp.getId()));
                // 添加工作经历
                empExprMapper.addBatch(exprList); // insert values (),(),()
            }
        } finally {
           // 3.记录操作日志
            EmpLog empLog = new EmpLog(emp.getId(), LocalDateTime.now(), "添加员工信息");
             empLogService.insertLog(empLog);
        }

    }

    @Override
    @Transactional
    // 批量删除
    public void removeBatch(List<Integer> ids) {
        // 1.调用持久层EmpMapper方法，批量删除员工信息
        // delete  from emp where id in (？，？，？)
        empMapper.deleteBatch(ids);

        // 2.调用持久层EmpExprMapper方法，批量删除员工经历信息
        // delete  from emp_expr where emp_id in (？，？，？)
        empExprMapper.deleteBatchExpr(ids);
    }
     // 通过id查询员工信息和员工经历信息
    @Override
    public Emp showById(Integer id) {
        // 1.调用持久层EmpMapper方法，根据id查询员工信息
        Emp emp = empMapper.selectById(id);
        // 2.调用持久层EmpExprMapper方法，根据id查询员工经历信息
        List<EmpExpr> exprList = empExprMapper.selectById(id);
        // 3.将两个查询结果封装到Emp对象中，返回
        emp.setExprList(exprList);
        return emp;

    }

    @Override
    public void update(Emp emp) {
        // 跟新员工信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
        // 2.跟新员工经历信息
        List<Integer> ids = new ArrayList<>();
        ids.add(emp.getId());
        empExprMapper.deleteBatchExpr(ids);
        // 2.2批量添加员工
        if(emp.getExprList()!=null&&emp.getExprList().size()>0){
            emp.getExprList().stream().forEach(ex->ex.setEmpId(emp.getId()));
            empExprMapper.addBatch(emp.getExprList());
        }

    }

    @Override
    public List<Emp> showAll() {
        List<Emp> empList=empMapper.showAll();
        return empList;
    }

    @Override
    public Emp login(Emp emp) {
        // 1.调用持久层EmpMapper方法，根据用户名查询员工信息
        Emp emp1=empMapper.selectByUsername(emp.getUsername());
        // 2.判断账号是否存在
        if(emp1.getUsername() == null){
            throw  new UserNameNot("账号不存在");
        }
        // 3.判断密码是否正确
        if(!Objects.equals(emp1.getPassword(),emp.getPassword())){
            throw  new PassWordNot("密码错误");
        }
        // 4.登录成功，返回员工信息
        return emp1;
    }
}
